<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>构造函数</title>
</head>
<body>
<h3>构造函数</h3>
<p>
    封装是面向对象思想中比较重要的一部分，js面向对象可以通过构造函数实现的封装。 <br>
    同样的将变量和函数组合到了一起并能通过 this 实现数据的共享， <br>
    所不同的是借助构造函数创建出来的实例对象之间是彼此不影响的
</p>
<p>
    总结： <br>
    1. 构造函数体现了面向对象的封装特性 <br>
    2. 构造函数实例创建的对象彼此独立、互不影响
</p>
<hr>

<pre style="font-size: 20px;">
1. Js 实现面向对象需要借助于谁来实现？
  构造函数
2. 构造函数存在什么问题？
  浪费内存
</pre>
<hr>

<script>
    // 构造函数  公共的属性和方法 封装到 '明星' 构造函数里面了
    // 1.公共的属性写到 构造函数里面
    function 明星(姓名, 年龄) {
        this.姓名 = 姓名
        this.年龄 = 年龄
        this.唱 = function () {
          console.log(`${姓名} 唱歌`)
        }
    }

    // 2. 公共的方法写到原型对象身上   节约了内存
    // 明星.prototype.唱 = function () {
    //     console.log('唱歌')
    // }

    // 创建对象
    const 刘德华 = new 明星('刘德华', 55)
    const 张学友 = new 明星('张学友', 58)

    // 对象.方法
    刘德华.唱() //调用
    张学友.唱() //调用

    // 对象之间不会互相影响
    console.log(刘德华 === 张学友)  // false
    console.log(刘德华.唱 === 张学友.唱) // false

    console.dir(明星.prototype) // 对象
</script>
</body>
</html>